package main

import (
	"fmt"
	"io"
	"net/http"
	"net/rpc"
	"net/rpc/jsonrpc"
)

type HelloService struct{}

func (s *HelloService) Hello(request string, reply *string) error {
	//返回值是通过修改reply的值
	fmt.Println(request)
	*reply = "hello, "
	return nil
}

func main() {
	//1. 实例化一个server
	_ = rpc.RegisterName("HelloService", &HelloService{})
	http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
		// 匿名函数内部定义了读写结构体
		var conn io.ReadWriteCloser = struct {
			io.Writer     // 写数据再哪里写
			io.ReadCloser // 读数据 和 关闭
		}{
			Writer:     w,      // 写 传递给客户端的数据
			ReadCloser: r.Body, // 读 传递给服务端的数据 和 关闭数据
		}
		BodyData, _ := io.ReadAll(r.Body)
		fmt.Println(string(BodyData))
		BodyData, _ = io.ReadAll(r.Body)
		fmt.Println(string(BodyData))
		// 转换成 json 格式   ServeRequest 和 ServeCodec 类似  用来调用 Hello 方法
		rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
	})
	http.ListenAndServe(":1234", nil)
}
